数据结构 作业5、二叉搜索树、平衡二叉树
开始时间09/09/2024 12:00:00 AM
结束时间12/25/2024 11:59:00 PM
答题时长155519分钟
答卷类型标准答案
试卷总分100
单选题74 分
2-1

设每个dd叉树的结点有dd个指针指向子树,有nn个结点的dd叉树有多少空链域?

| 参考答案
答案
C
2分
2-2

下面说法中哪个是错误的:

| 参考答案
答案
B
2分
2-3

对二叉搜索树进行什么遍历可以得到从小到大的排序序列?

| 参考答案
答案
C
1分
2-4

若二叉搜索树是有NN个结点的完全二叉树,则不正确的说法是:

| 参考答案
答案
B
1分
2-5

已知8个数据元素为(34,76,45,18,26,54,92,65),按照依次插入结点的方法生成一棵二叉搜索树后,最后两层上的结点总数为:

| 参考答案
答案
B
1分
2-6

AVL树是一种平衡的二叉搜索树,树中任一结点具有下列哪一特性:

| 参考答案
答案
B
1分
2-7

下列二叉搜索树中,满足平衡二叉树定义的是:

| 参考答案
答案
C
1分
2-8

12个结点的AVL树的最大深度是?

| 参考答案
答案
C
1分
2-9

将下列数(88, 70, 61, 96, 120, 90)按顺序插入初始为空的AVL中,所形成的AVL树的前序遍历结果是:

| 参考答案
答案
D
1分
2-10

若AVL树的深度是6(空树的深度定义为-1),则该树的最少结点数是:

| 参考答案
答案
D
2分
2-11

堆的形状是一棵:

| 参考答案
答案
D
1分
2-12

创建一个初始堆,含有NN个记录,其时间复杂度是:

| 参考答案
答案
B
1分
2-13

将6、4、3、5、8、9顺序插入初始为空的最大堆(大根堆)中,那么插入完成后堆顶的元素为:

| 参考答案
答案
D
1分
2-14

将10、12、1、14、6、5、8、15、3、9、7逐个按顺序插入到初始为空的最小堆(小根堆)中,然后连续执行两次删除最小元素操作(DeleteMin),此后堆顶的元素是什么?

| 参考答案
答案
A
1分
2-15

对于一个有NN个结点、KK条边的森林,共有几棵树?

| 参考答案
答案
A
1分
2-16

设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数?

| 参考答案
答案
B
1分
2-17

由分别带权为9、2、5、7的四个叶子结点构成一棵哈夫曼树,该树的带权路径长度为:

| 参考答案
答案
C
1分
2-18

对最小堆(小顶堆){1,3,2,6,7,5,4,15,14,12,9,10,11,13,8} 进行三次删除最小元的操作后,结果序列为:

| 参考答案
答案
B
1分
2-19

将{28, 15, 42, 18, 22, 5, 40}依次插入初始为空的二叉搜索树。则该树的后序遍历结果是:

| 参考答案
答案
D
1分
2-20

设最小堆(小根堆)的层序遍历结果为{1, 3, 2, 5, 4, 7, 6}。用线性时间复杂度的算法将该堆调整为最大堆(大根堆),则该树的中序遍历结果为:

| 参考答案
答案
C
1分
2-21

在有nn>1>1)个元素的最大堆(大根堆)中,最小元的数组下标可以是:

| 参考答案
答案
C
1分
2-22

二叉树的中序遍历也可以循环地完成。给定循环中堆栈的操作序列如下(其中push为入栈,pop为出栈):

push(1), push(2), push(3), pop(), push(4), pop(), pop(), push(5), pop(), pop(), push(6), pop()

以下哪句是对的?

| 参考答案
答案
C
1分
2-23

在一个有2333个元素的最小堆中,下列哪个下标不可能是最大元的位置?

| 参考答案
答案
A
1分
2-24

在下述结论中,正确的是:

① 只有2个结点的树的度为1;

② 二叉树的度为2;

③ 二叉树的左右子树可任意交换;

④ 在最大堆(大顶堆)中,从根到任意其它结点的路径上的键值一定是按非递增有序排列的。

| 参考答案
答案
A
1分
2-25

将键值1到15顺序插入一个初始为空的斜堆。则下列句子中哪句是错的?

| 参考答案
答案
B
1分
2-26

如果AVL树的深度为5(空树的深度定义为0),则此树最少有多少个结点?

| 参考答案
答案
A
2分
2-27

将一系列数字顺序一个个插入一棵初始为空的AVL树。下面哪个系列的第一次旋转是“右-左”双旋?

| 参考答案
答案
D
2分
2-28

将 1, 2, 3, 6, 5, 4 顺序一个个插入一棵初始为空的AVL树,会经历下列哪些旋转?

| 参考答案
答案
C
2分
2-29

若一棵AVL树有 28 个结点,则该树的最大深度为__。空树的深度定义为0。

| 参考答案
答案
C
2分
2-30

已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:

| 参考答案
答案
A
2分
2-31

已知二叉排序树如下图所示,元素之间应满足的大小关系是:

fGRE17-6.JPG

| 参考答案
答案
C
2分
2-32

在将数据序列( 6, 1, 5, 9, 8, 4, 7 )建成大根堆时,正确的序列变化过程是:

| 参考答案
答案
A
2分
2-33

若将一棵树 TT 转化为对应的二叉树 BTBT,则下列对 BTBT 的遍历中,其遍历序列与 TT 的后根遍历序列相同的是:

| 参考答案
答案
B
2分
2-34

对于任意一棵高度为 5 且有 10 个结点的二叉树,若采用顺序存储结构保存,每个结点占 1 个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元的数量至少是:

| 参考答案
答案
A
2分
2-35

下列给定的关键字输入序列中,不能生成如下二叉排序树的是:

GRE20-5.JPG

| 参考答案
答案
B
1分
2-36

在下列所示的平衡二叉树中,插入关键字48后得到一棵新平衡二叉树。在新平衡二叉树中,关键字37所在结点的左、右子结点中保存的关键字分别是:

| 参考答案
答案
C
1分
2-37

设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1M_1M2M_2M3M_3。则与森林F对应的二叉树根结点的右子树上的结点个数是:

| 参考答案
答案
C
1分
2-38

将{ 5, 11, 13, 1, 3, 6 }依次插入初始为空的二叉搜索树。则该树的后序遍历结果是:

| 参考答案
答案
B
2分
2-39

若二叉搜索树是有NN个结点的完全二叉树,则不正确的说法是:

| 参考答案
答案
C
1分
2-40

若一棵二叉树的后序遍历序列是{ 1, 3, 2, 6, 5, 7, 4 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?

| 参考答案
答案
A
2分
2-41

已知不相交集合用数组表示为{ 4, 6, 5, 2, -3, -4, 3 }。若集合元素从1到7编号,则调用Union(Find(7),Find(1))(按规模求并,并且带路径压缩)后的结果数组为:

| 参考答案
答案
D
1分
2-42

如果AVL树的深度为6(空树的深度定义为1-1),则此树最少有多少个结点?

| 参考答案
答案
C
2分
2-43

将 9, 8, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的?

| 参考答案
答案
A
1分
2-44

已知一棵二叉树的树形如下图所示,其后序序列为{ e, a, c, b, d, g, f }。树中与结点a同层的结点是:

| 参考答案
答案
B
2分
2-45

对以下算法功能最准确的描述是()。

int  fun1(BTreeNode *BT, ElemType e){
int  n1, n2;
         if (BT==NULL)  return 0;
         if (BT->data==e)  return 1;
         n1 = fun1(BT->left, e);
         if (n1>=1)  return n1+1;
         n2 = fun1(BT->right, e);
         if (n2>=1)  return n2+1;
         return 0;
}
| 参考答案
答案
C
2分
2-46

设一棵非空完全二叉树 TT 的所有叶节点均位于同一层,且每个非叶结点都有 2 个子结点。若 TTkk 个叶结点,则 TT 的结点总数是:

| 参考答案
答案
A
1分
2-47

nn 个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有 115 个结点,则 nn 的值是:

| 参考答案
答案
C
2分
2-48

设 T 是非空二叉树,若 T 的先序遍历和后序遍历序列相同,则 T 的形态是 __

| 参考答案
答案
A
1分
2-49

设 T 是非空二叉树,若 T 的后序遍历和中序遍历序列相同,则 T 的形态是 __

| 参考答案
答案
C
1分
2-50

以二叉链表作为二叉树的存储结构,在具有 nn 个结点的二叉链表中(n>0n>0),空链域的个数为 __

| 参考答案
答案
A
1分
2-51

一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶子结点个数是( )。

| 参考答案
答案
B
1分
2-52

若某二叉树有 5 个叶结点,其权值分别为 10、12、16、21、30,则其最小的带权路径长度(WPL)是:

| 参考答案
答案
B
1分
2-53

对于先序遍历与中序遍历结果相同的二叉树为( )

| 参考答案
答案
C
1分
2-54

若结点 p 与 q 在二叉树 T 的中序遍历序列中相邻, 且 p 在 q 之前,则下列 p 与 q 的关系中,不可能的是

I. q 是 p 的双亲

II. q 是 p 的右孩子

III. q 是 p 的右兄弟

IV. q 是 p 的双亲的双亲

| 参考答案
答案
B
1分
2-55

对任意给定的含 nn (n>2n>2) 个字符的有限集 SS,用二叉树表示 SS 的哈夫曼编码集和定长编码集,分别得到二叉树 T1T1T2T2。 下列叙述中,正确的是:

| 参考答案
答案
D
1分
2-56

在下图所示的 5 阶 B 树 T 中,删除关键字 260 之后需要进行必要的调整,得到新的 B 树 T1。下列选项中,不可能是 T1 根结点中关键字序列的是

T树.png

| 参考答案
答案
D
1分
程序填空题26 分
5-1

下列代码的功能是将二叉树T中的结点按照层序遍历的顺序输出。

typedef struct TreeNode *Tree;
struct TreeNode
{
   int Key;
   Tree  Left;
   Tree  Right;
};

void Level_order ( Tree T )
{
   Queue Q;

   if ( !T ) return; 
   Q = CreateQueue( MaxElements ); 
   Enqueue( T, Q ); 
   while ( !IsEmpty( Q ) ){
      T = Front_Dequeue ( Q ); /* return the front element and delete it from Q */
      printf("%d ", T->Key);
      if ( T->Left ) 
         
2分
; if (
2分
)
2分
; } }
| 参考答案
填空#1
Enqueue( T->Left, Q )
填空#2
T->Right
填空#3
Enqueue( T->Right, Q )
| 评测详情
填空详情
6分
5-2

下列代码的功能是从一个大顶堆H的某个指定位置p开始执行下滤。

void PercolateDown( int p, PriorityQueue H )
{
   int  child;
   ElementType  Tmp = H->Elements[p];
   for ( ; p * 2 <= H->Size; p = child ) {
      child = p * 2;
      if ( child!=H->Size && 
2分
) child++; if ( H->Elements[child] > Tmp )
2分
; else break; } H->Elements[p] = Tmp; }
| 参考答案
填空#1
H->Elements[child+1] > H->Elements[child]
填空#2
H->Elements[p] = H->Elements[child]
| 评测详情
填空详情
4分
5-3

下列代码的功能是计算给定二叉树T的宽度。二叉树的宽度是指各层结点数的最大值。函数Queue_rearQueue_front分别返回当前队列Q中队尾和队首元素的位置。

typedef struct TreeNode *BinTree;
struct TreeNode
{
   int Key;
   BinTree  Left;
   BinTree  Right;
};

int Width( BinTree T )
{
   BinTree  p;
   Queue Q;
   int Last, temp_width, max_width;
   
   temp_width = max_width = 0;
   Q = CreateQueue(MaxElements);
   Last = Queue_rear(Q);
   if ( T == NULL) return 0;
   else {
      Enqueue(T, Q);
      while (!IsEmpty(Q)) {
         p = Front_Dequeue(Q); 
         
2分
; if ( p->Left != NULL ) Enqueue(p->Left, Q);
2分
; if ( Queue_front(Q) > Last ) { Last = Queue_rear(Q); if ( temp_width > max_width ) max_width = temp_width;
2分
; } /* end-if */ } /* end-while */ return max_width; } /* end-else */ }
| 参考答案
填空#1
temp_width++
填空#2
if ( p->Right != NULL ) Enqueue (p->Right, Q)
填空#3
temp_width = 0
| 评测详情
填空详情
6分
5-4

下列代码的功能是将大顶堆H中指定位置P上的元素的整数键值上调D个单位,然后继续将H调整为大顶堆。

void IncreaseKey( int P, int D, PriorityQueue H )
{
   int i, key;
   key = H->Elements[P] + D;
   for ( i = 
2分
; H->Elements[i/2] < key; i/=2 )
2分
; H->Elements[i] = key; }
| 参考答案
填空#1
P
填空#2
H->Elements[i] = H->Elements[i/2]
| 评测详情
填空详情
4分
5-5

IsRBTree (3)

The functions IsRBTree is to check if a given binary search tree T is a red-black tree. Return true if T is, or false if not.

The red-black tree structure is defined as the following:

typedef enum { red, black } colors;
typedef struct RBNode *PtrToRBNode;
struct RBNode{
    int Data;
    PtrToRBNode Left, Right, Parent;
    int BH; /* black height */
    colors Color;
};
typedef PtrToRBNode RBTree;

Please fill in the blanks.

bool IsRBTree( RBTree T )
{
    int LeftBH, RightBH;
    if ( !T ) return true;
    if ( T->Color == black ) T->BH = 1;
    else {
         if ( T->Left && (T->Left->Color == red)) return false;
         if ( T->Right && 
2分
) return false; } if ( !T->Left && !T->Right ) return true; if (
2分
) { if ( T->Left ) LeftBH = T->Left->BH; else LeftBH = 0; if ( T->Right ) RightBH = T->Right->BH; else RightBH = 0; if ( LeftBH == RightBH ) {
2分
; return true; } else return false; } else return false; }
| 参考答案
填空#1
(T->Right->Color == red)
填空#2
IsRBTree( T->Left ) && IsRBTree( T->Right )
填空#3
T->BH += LeftBH
| 评测详情
填空详情
6分